package com.jz.opengl;

import android.opengl.GLES20;


/**
 * @author jackzhous
 * @package com.jz.opengl
 * @filename GLHelper
 * date on 2019/6/27 2:29 PM
 * @describe
 * openGL辅助类
 * @email jackzhouyu@foxmail.com
 **/
public class GLHelper {

    /**
     * 获取编译的sourceCode
     * @param type
     * @param sourceCode
     * @return
     */
    public static int getCompileShader(int type, String sourceCode){
        //创建着色器
        int glShaderId = GLES20.glCreateShader(type);

        if(glShaderId == 0){
            LogHelper.log_i("create shader error!");
            return 0;
        }

        /**
         * 加入我们定义opengl的源码，在raw文件加下
         * 编译源码，为什么要这么做？
         * openGL的所有功能都是JNI层实现的，java层最终都是在jvm中运行的，jni是拿不到数据
         * 所以我们编写的源码，经过编译在jni产生openGL想要的源码
         */
        GLES20.glShaderSource(glShaderId, sourceCode);
        GLES20.glCompileShader(glShaderId);
        int[] compileStatus = new int[1];
        GLES20.glGetShaderiv(glShaderId, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
        if(compileStatus[0] == 0){
            LogHelper.log_i("compile source code error!");
            return 0;
        }
        return glShaderId;
    }

    /**
     * 编译了源码只是我们要的功能，这些功能需要使用OpenGL的东东，所以需要链接openGL program
     * @param vertexShader
     * @param fragShader
     * @return
     */
    public static int linkOpenGLProgram(int vertexShader, int fragShader){
        int glProgram = GLES20.glCreateProgram();
        if(glProgram == 0){
            LogHelper.log_i("create openGL program error!");
            return 0;
        }

        GLES20.glAttachShader(glProgram, vertexShader);
        GLES20.glAttachShader(glProgram, fragShader);
        GLES20.glLinkProgram(glProgram);

        int[] linkStatus = new int[1];
        GLES20.glGetProgramiv(glProgram,GLES20.GL_LINK_STATUS, linkStatus, 0);
        if(linkStatus[0] == 0){
            LogHelper.log_i("link openGL source code error!");
            return 0;
        }
        return glProgram;
    }

}
